package com.atguigu.spzx.manager.controller;

import com.atguigu.spzx.common.log.anno.Log;
import com.atguigu.spzx.manager.service.SysRoleService;
import com.atguigu.spzx.model.entity.system.SysRole;
import com.atguigu.spzx.model.vo.common.Result;
import com.github.pagehelper.PageInfo;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.util.StopWatch;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Tag(name = "角色管理模块")
@RestController
@RequestMapping("/admin/system/role")
public class SysRoleController {
    @Resource
    SysRoleService sysRoleService;
    @Operation(summary = "根据用户id查询所有角色，以及是否已分配")
    @GetMapping("findAllRole/{userId}")
    public Result findAllRole(@PathVariable("userId")Long userId){
        List<SysRole> sysRoleList = sysRoleService.findAllRole(userId);
        return Result.ok().data(sysRoleList);
    }

    // 请求方式+路径+参数列表 匹配唯一的一个 HandlerMapping
    //路径匹配失败：404
    //路径匹配成功，请求方式匹配失败：405
    //路径匹配成功，请求方式匹配成功，参数列表(包含请求头)匹配失败：400
    //以上都匹配成功，接口方法一定会指定，业务代码抛出异常时：500
    @Operation(summary = "根据id查询角色")
    @GetMapping("{id}")
    public Result getById(@PathVariable("id")Long id){
        SysRole sysRole = sysRoleService.getById(id);
        return Result.ok().data(sysRole);
    }
    @Operation(summary = "更新角色")
    @PutMapping("/update")
    public Result updateRole(@RequestBody SysRole sysRole){
        sysRoleService.updateRole(sysRole);
        return Result.ok();
    }

    //如果前端需要局部更新：后端增删改可能需要返回操作的结果
    @Operation(summary = "新增角色")
    @PostMapping("/save")
    @Log(title = "角色管理模块" , isSaveRequestParams = true , isSaveResponseData = false,
            operatorType = "OTHER" , businessType = 1)
    public Result saveRole(@RequestBody SysRole sysRole){
        sysRoleService.saveRole(sysRole);
        return Result.ok();
    }

    @Operation(summary = "根据id删除角色接口")
    @DeleteMapping("{id}")
    // 后面分布式项目中  数据可能分库分表  多张表的数据组合成了一张表  所以要求所有的id都是全局唯一的
    //uuid虽然唯一 但是是32位的 无序的 包含16进制字符的 过滤性差的 字符串
    //雪花算法：可以生成19位的10进制的 按照时间顺序递增的 id
    public Result deleteById(@PathVariable("id")Long id){
        sysRoleService.deleteById(id);
        return Result.ok();
    }


    @Operation(summary = "条件查询角色列表")
    @Parameters({
            @Parameter(name = "pageNum" , description = "页码" , in = ParameterIn.PATH ,example = "1"),
            @Parameter(name = "pageSize" , description = "每页记录数" , in = ParameterIn.PATH ,example = "3"),
            @Parameter(name = "keyword" , description = "查询条件")
    })
    @Log(title = "角色管理模块" , isSaveRequestParams = true , isSaveResponseData = true,
        operatorType = "MANAGE" , businessType = 0)
    @GetMapping("page/{pageNum}/{pageSize}")
    public Result page(@PathVariable("pageNum")Integer pageNum ,
                       @PathVariable("pageSize")Integer pageSize,
                       String keyword){
        StopWatch stopWatch = new StopWatch();
        stopWatch.start("查询角色管理时间统计：");
        PageInfo<SysRole>  pageInfo = sysRoleService.findPage(pageNum , pageSize , keyword);
        stopWatch.stop();
        System.out.println(stopWatch.prettyPrint());
        return Result.ok().data(pageInfo);
    }

}
